package com.platform.common.utils.dataImport;

import com.alibaba.fastjson.JSONObject;
import com.platform.common.exception.BusinessException;
import com.platform.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
public abstract class BaseImportExcel {

    /**
     * 校验表格标题头
     */
    public String comparison = null;
    /**
     * 将每一行按下标转换成对象 配合toObject方法使用
     */
    public String[] format = null;

    public int offset = 1;

    /**
     * 转对象
     *
     * @param strs
     */
    public <T> T toObj(String[] strs, Class<T> c) {
        JSONObject jsonObject = new JSONObject();
        int length = strs.length;
        try {
            for (int i = 0; i < format.length; i++) {
                jsonObject.put(format[i], i >= length ? null : strs[i]);
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new BusinessException("解析出错！请核对数据格式是否正确！");
        }
        return jsonObject.toJavaObject(c);
    }

    /**
     * 前置执行，主要用于格式校验
     * @param list
     * @return
     */
    public boolean front(List<String[]> list){
        log.info(String.format("--------%s 导入开始---------", this.getClass().getName()));
        if(list == null || list.isEmpty()){
            return false;
        }
        return verifyFirstRow(list.get(offset - 1));
    }

    /**
     * 前置执行，主要用于格式校验
     * @param strs
     * @param strs
     * @return
     */
    public boolean verifyFirstRow(String[] strs){
        if(StringUtils.isBlank(comparison)){
            return true;
        }
        String firstRow = Arrays.stream(strs).map(String::trim).collect(Collectors.joining(","));
        System.out.println(firstRow);
        return comparison.equals(firstRow);
    }

    /**
     * 主要处理方法
     *
     * @param strs
     */
    public abstract void major(String[] strs);

    /**
     * 后置执行
     * @return
     */
    public void after(){
        log.info(String.format("--------%s 导入结束---------", this.getClass().getName()));
    }

    public static String getValue(String[] strs, int index){
        if(strs.length <= index){
            return null;
        }
        if(StringUtils.isBlank(strs[index])){
            return null;
        }
        return strs[index];
    }

}
